home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Audio, Video & Photo / Songbird 0.7.0 / Songbird_0.7.0_windows-i686-msvc8.exe / components / ArrayConverter.jsm next >
Text File  |  2008-08-06  |  7KB  |  247 lines

  1. /*
  2.  * NOTE: This was snagged from https://bugzilla.mozilla.org/show_bug.cgi?id=380839
  3.  * This will go away when this lands
  4.  */
  5.  
  6. /* ***** BEGIN LICENSE BLOCK *****
  7.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  8.  *
  9.  * The contents of this file are subject to the Mozilla Public License Version
  10.  * 1.1 (the "License"); you may not use this file except in compliance with
  11.  * the License. You may obtain a copy of the License at
  12.  * http://www.mozilla.org/MPL/
  13.  *
  14.  * Software distributed under the License is distributed on an "AS IS" basis,
  15.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  16.  * for the specific language governing rights and limitations under the
  17.  * License.
  18.  *
  19.  * The Original Code is Code modules: JavaScript array converter.
  20.  *
  21.  * The Initial Developer of the Original Code is
  22.  * Alexander J. Vincent <ajvincent@gmail.com>.
  23.  * Portions created by the Initial Developer are Copyright (C) 2007
  24.  * the Initial Developer. All Rights Reserved.
  25.  *
  26.  * Contributor(s):
  27.  *
  28.  * Alternatively, the contents of this file may be used under the terms of
  29.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  30.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  31.  * in which case the provisions of the GPL or the LGPL are applicable instead
  32.  * of those above. If you wish to allow use of your version of this file only
  33.  * under the terms of either the GPL or the LGPL, and not to allow others to
  34.  * use your version of this file under the terms of the MPL, indicate your
  35.  * decision by deleting the provisions above and replace them with the notice
  36.  * and other provisions required by the GPL or the LGPL. If you do not delete
  37.  * the provisions above, a recipient may use your version of this file under
  38.  * the terms of any one of the MPL, the GPL or the LGPL.
  39.  *
  40.  * ***** END LICENSE BLOCK ***** */
  41.  
  42. /**
  43.  * Utilities for JavaScript components loaded by the JS component
  44.  * loader.
  45.  *
  46.  * Import into a JS component using
  47.  * 'Components.utils.import("rel:ArrayConverter.jsm");'
  48.  *
  49.  */
  50.  
  51. EXPORTED_SYMBOLS = [ "ArrayConverter" ];
  52.  
  53. debug("*** loading ArrayConverter\n");
  54.  
  55. /**
  56.  * Get a simple enumerator.
  57.  *
  58.  * @param aItemsList JavaScript array to enumerate.
  59.  */
  60. function Enumerator(aItemsList) {
  61.   this._itemsList = aItemsList;
  62.   this._iteratorPosition = 0;
  63. }
  64. Enumerator.prototype = {
  65.   // nsISimpleEnumerator
  66.   hasMoreElements: function hasMoreElements() {
  67.     return (this._iteratorPosition < this._itemsList.length);
  68.   },
  69.  
  70.   // nsISimpleEnumerator
  71.   getNext: function getNext() {
  72.     if (!(this.hasMoreElements())) {
  73.       throw Components.results.NS_ERROR_FAILURE;
  74.     }
  75.     var type = this._itemsList[this._iteratorPosition];
  76.     this._iteratorPosition++;
  77.     return type;
  78.   },
  79.  
  80.   // nsISupports
  81.   QueryInterface: function QueryInterface(aIID)
  82.   {
  83.     if (aIID.equals(Components.interfaces.nsISimpleEnumerator) ||
  84.         aIID.equals(Components.interfaces.nsISupports))
  85.       return this;
  86.  
  87.     throw Components.results.NS_ERROR_NO_INTERFACE;
  88.   }
  89. }
  90.  
  91. /**
  92.  * Get a string enumerator.
  93.  *
  94.  * @param aItemsList JavaScript array to enumerate.
  95.  */
  96. function StringEnumerator(aItemsList) {
  97.   this._itemsList = aItemsList;
  98.   this._iteratorPosition = 0;
  99. }
  100. StringEnumerator.prototype = {
  101.   // nsIStringEnumerator
  102.   hasMore: function hasMore() {
  103.     return (this._iteratorPosition < this._itemsList.length);
  104.   },
  105.  
  106.   // nsIStringEnumerator
  107.   getNext: function getNext() {
  108.     if (!(this.hasMore())) {
  109.       throw Components.results.NS_ERROR_FAILURE;
  110.     }
  111.     var type = this._itemsList[this._iteratorPosition];
  112.     this._iteratorPosition++;
  113.     return type;
  114.   },
  115.  
  116.   // nsISupports
  117.   QueryInterface: function QueryInterface(aIID)
  118.   {
  119.     if (aIID.equals(Components.interfaces.nsIStringEnumerator) ||
  120.         aIID.equals(Components.interfaces.nsISupports))
  121.       return this;
  122.  
  123.     throw Components.results.NS_ERROR_NO_INTERFACE;
  124.   }
  125. }
  126.  
  127. function NSArray(aItemsList) {
  128.   this._itemsList = aItemsList;
  129. }
  130. NSArray.prototype = {
  131.   // nsIArray
  132.   get length() {
  133.     return this._itemsList.length;
  134.   },
  135.  
  136.   // nsIArray
  137.   queryElementAt: function queryElementAt(aIndex, aIID) {
  138.     if (aIndex > this.length - 1) {
  139.       throw Components.results.NS_ERROR_ILLEGAL_VALUE;
  140.     }
  141.  
  142.     return this._itemsList[aIndex].QueryInterface(aIID);
  143.   },
  144.  
  145.   // nsIArray
  146.   indexOf: function indexOf(aIndex, aElement) {
  147.     for (var i = aIndex; i < this._itemsList.length; i++) {
  148.       if (this._itemsList[i] == aElement) {
  149.         return i;
  150.       }
  151.     }
  152.     throw Components.results.NS_ERROR_NOT_FOUND;
  153.   },
  154.  
  155.   // nsIArray
  156.   enumerate: function enumerate() {
  157.     return new Enumerator(this._itemsList);
  158.   },
  159.  
  160.   // nsISupports
  161.   QueryInterface: function QueryInterface(aIID)
  162.   {
  163.     if (aIID.equals(Components.interfaces.nsIArray) ||
  164.         aIID.equals(Components.interfaces.nsISupports))
  165.       return this;
  166.  
  167.     throw Components.results.NS_ERROR_NO_INTERFACE;
  168.   }
  169. }
  170.  
  171. var ArrayConverter = {
  172.   /**
  173.    * Get a JavaScript array for a nsIArray or nsISimpleEnumerator.
  174.    *
  175.    * @param aObject nsIArray or nsISimpleEnumerator to convert.
  176.    *
  177.    * @throws NS_ERROR_INVALID_ARG.
  178.    */
  179.   JSArray: function getJSArray(aObject) {
  180.     if (aObject instanceof Components.interfaces.nsIArray) {
  181.       aObject = aObject.enumerate();
  182.     }
  183.  
  184.     if (!(aObject instanceof Components.interfaces.nsISimpleEnumerator)) {
  185.       throw Components.results.NS_ERROR_INVALID_ARG;
  186.     }
  187.  
  188.     var array = [];
  189.     while (aObject.hasMoreElements()) {
  190.       array[array.length] = aObject.getNext();
  191.     }
  192.     return array;
  193.   },
  194.  
  195.   /**
  196.    * Return a nsIArray for a JavaScript array.
  197.    *
  198.    * @param aArray JavaScript array to convert.
  199.    */
  200.   nsIArray: function get_nsIArray(aArray) {
  201.     return new NSArray(aArray);
  202.   },
  203.  
  204.   /**
  205.    * Return a nsISimpleEnumerator for a JavaScript array.
  206.    *
  207.    * @param aArray JavaScript array to convert.
  208.    */
  209.   enumerator: function get_enumerator(/* in JSArray */ aArray) {
  210.     return new Enumerator(aArray);
  211.   },
  212.  
  213.   /**
  214.    * Return a nsIStringEnumerator for a JavaScript array.
  215.    *
  216.    * @param aArray JavaScript array to convert.
  217.    */
  218.   stringEnumerator: function get_stringEnumerator(/* in JSArray */ aArray) {
  219.     return new StringEnumerator(aArray);
  220.   },
  221.  
  222.   /**
  223.    * Return a method to convert a JavaScript array into a XPCOM array.
  224.    *
  225.    * @param aArrayName Name of JavaScript array property in "this" to convert.
  226.    */
  227.   xpcomArrayMethod: function getXPCOMMethod(aArrayName) {
  228.     /**
  229.      * Return a XPCOM array and count.
  230.      *
  231.      * @param (out) aCount The length of the array returned.
  232.      *
  233.      * @return The XPCOM array.
  234.      */
  235.     return function xpcomArray(aCount) {
  236.       var array = this[aArrayName];
  237.       aCount.value = array.length;
  238.       var rv = [];
  239.       for (var i = 0; i < array.length; i++) {
  240.         rv[i] = array[i];
  241.       }
  242.       return rv;
  243.     }
  244.   }
  245. };
  246.  
  247.